运行时刻是指一个程序在运行(cc或者在被执行)的状态。也就是说,当你打开一个程序使它在电脑上运行的时候,那个程序就是处于运行时刻。在一些
编程语言中,把某些可以重用的程序或者实例打包或者重建成为“
运行库”。这些实例可以在它们运行的时候被链接或者被任何程序调用。
简介
开发者有时候会在什么东西应该在编译的时候加载进来以及什么东西该在运行的时候使用之间做出抉择,前者有时候被称为编译时期。
相关内容
Runtime类封装了
运行时的环境。每个
Java应用程序都有一个Runtime 类实例,使应用程序能够与其运行的环境相连接。
一般不能实例化一个Runtime对象,应用程序也不能创建自己的Runtime 类实例,但可以通过getRuntime 方法获取当前Runtime运行时对象的引用。
一旦得到了一个当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制Java
虚拟机的状态和行为。
当
Applet和其他不被信任的代码调用任何Runtime方法时,常常会引起SecurityException异常。
常见应用
1、内存管理:
Java提供了无用单元自动收集机制。通过totalMemory()和freeMemory()方法可以知道对象的
堆内存有多大,还剩多少。
Java会周期性的回收垃圾对象(未使用的对象),以便释放
内存空间。但是如果想先于
收集器的下一次指定周期来收集废弃的对象,可以通过调用gc()方法来根据需要运行无用单元收集器。一个很好的试验方法是先调用gc()方法,然后调用freeMemory()方法来查看基本的内存使用情况,接着执行代码,然后再次调用freeMemory()方法看看分配了多少内存。下面的程序演示了这个构想。
编译后运行结果如下(不同的机器不同时间运行的结果也不一定一样):
Total memory is :2031616
Initial free is : 1818488
Free memory after garbage collection : 1888808
Free memory after allocation : 1872224
Memory used by allocation : 16584
Free memory after collecting discarded integers : 1888808
2、执行其他程序
在安全的环境中,可以在
多任务操作系统中使用Java去执行其他特别大的进程(也就是程序)。exec()方法有几种形式命名想要运行的程序和它的
输入参数。exec()方法返回一个Process对象,可以使用这个对象控制Java程序与新运行的进程进行交互。exec()方法本质是依赖于环境。
下面的例子是使用exec()方法启动
windows的记事本notepad。这个例子必须在
Windows操作系统上运行。
exec()还有其他几种形式,例子中演示的是最常用的一种。exec()方法返回Process对象后,在新程序开始运行后就可以使用Process的方法了。可以用destory()方法杀死
子进程,也可以使用waitFor()方法
等待程序直到
子程序结束,exitValue()方法返回子进程结束时返回的值。如果没有错误,将返回0,否则返回非0。下面是关于exec()方法的例子的改进版本。例子被修改为等待,直到运行的进程退出:
下面是运行的结果(当关闭
记事本后,会接着运行程序,打印信息):
当子进程正在运行时,可以对
标准输入输出进行读写。getOutputStream()方法和getInPutStream()方法返回对子进程的标准输入和输出。
系统
Run-time system
一个run-time system也叫做
运行时系统,运行时环境,实现了一个
计算机语言的核心行为。
每一种计算机语言都实现了某种形式的运行时系统,无论这种语言是
编译语言,
解释语言,还是嵌入式
领域特定语言。【compiled language, interpreted language, embedded domain-specific language】或者有些语言会通过API调用以线程形式调用。除了要支持语言的低级行为之外,一个运行时系统还要实现更高层次的行为,甚至要执行
类型检查,调试,或者
代码生成与优化。
作为一个简单的运行时系统的例子,C语言的运行时系统是
编译器插入到
可执行文件中的一个特殊的指令集合。此外,这些特殊的指令集合还管理处理器栈,为
局部变量分配空间,并把
函数调用参数拷贝到
栈顶。之所以这些行为是运行时系统的一部分而不是语言的关键部分,是因为这些行为时
系统行为,这些行为在程序的执行全过程中维护了栈的状态。并且这些系统行为实现了语言的执行模型,而不是实现了与特定计算结果有关的语义。
另一个展示运行时系统特性的例子是使用API与运行时系统交互。对这个API的调用看起来就像是对
软件库的调用一样,然而运行时系统添加了实现了一个执行模型的系统性行为。这里的API添加了插
桩代码会调用运行时系统,而不是使用一个包含代码的库直接实现软件行为。一个人只要了解构成一个库的语言就能够理解这个库的行为。然而,一个人要想了解刚才那个调用
运行时库的API不能只了解构成API的语言本身。还要知道由运行时系统实现的执行模型是什么样的。
这就是一种
嵌入式语言如posix threads和一个软件库的区别。虽然posix threads和软件库都是通过一个API调用,但是posix threads的行为不能通过代码用的语言本身理解。实际上posix threads的调用还是要依赖于运行时系统提供的执行模型。
某些compiled或者interpreted的语言提供一个允许应用代码直接和运行时系统交互的接口。一个例子是JAVA中的Thread类,通常情况下一个语言的核心行为(如
任务调度和资源管理)是不能够通过这种方式使得应用代码能够接触到的。
其他信息
addShutdownHook(
Thread hook)
availableProcessors()
向 Java虚拟机返回可用处理器的数目。
exec(String command)
exec(String[] cmdarray)
在单独的进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp)
在指定环境的独立进程中执行指定命令和变量。
exec(String[] cmdarray, String[] envp, File dir)
在指定环境和工作目录的独立进程中执行指定的命令和变量。
exec(String command, String[] envp)
在指定环境的单独进程中执行指定的字符串命令。
exec(String command, String[] envp, File dir)
在有指定环境和工作目录的独立进程中执行指定的字符串命令。
exit(int status)
通过启动
虚拟机的关闭序列,终止当前正在运行的 Java虚拟机。
freeMemory()
返回 Java虚拟机中的空闲内存量。
gc()
运行垃圾回收器。
InputStream getLocalizedInputStream(InputStream in)
已过时。 从
JDK 1.1 开始,将本地编码
字节流转换为
Unicode字符流的首选方法是使用 InputStreamReader 和 BufferedReader 类。
OutputStream getLocalizedOutputStream(OutputStream out)
已过时。 从 JDK 1.1 开始,将 Unicode字符流转换为本地编码字节流的首选方法是使用 OutputStreamWriter、
BufferedWriter 和 PrintWriter 类。
getRuntime()
返回与当前 Java应用程序相关的运行时对象。
halt(int status)
强行终止正在运行的 Java 虚拟机。
loadLibrary(String libname)
加载具有指定库名的动态库。
maxMemory()
removeShutdownHook(Thread hook)
取消注册某个先前已注册的虚拟机关闭挂钩。
runFinalization()
运行挂起 finalization 的所有对象的终止方法。
runFinalizersOnExit(value)
已过时。 此方法本身具有不安全性。它可能对正在使用的对象调用终结方法,而其他线程正在操作这些对象,从而导致不正确的行为或死锁。
totalMemory()
traceInstructions(on)
traceMethodCalls(on)